#pragma once
#include "Common.hpp"

class InetAddr
{
    public:

    InetAddr() {};
    InetAddr(struct sockaddr_in &addr)
    {
        _addr = addr; // 直接保存网络字节序的地址结构
        // 将网络字节序的端口号转换为主机字节序，存入_port
        _port = ntohs(_addr.sin_port);
        // 临时缓冲区，用于存储转换后的IP字符串
        char buf[64];
        // 将网络字节序的二进制IP转换为字符串形式（如"192.168.1.1"）
        inet_ntop(AF_INET, &_addr.sin_addr, buf, sizeof(buf));
        _ip = buf; // 保存字符串IP到成员变量
    }
    InetAddr(uint16_t port) : _port(port)
    { // 初始化列表设置主机字节序的端口
        // 清空_addr结构体（避免内存残留值）
        memset(&_addr, 0, sizeof(_addr));
        _addr.sin_family = AF_INET; // 设置为IPv4协议
        // IP地址设为INADDR_ANY（0.0.0.0），表示绑定到本机所有可用网卡
        _addr.sin_addr.s_addr = INADDR_ANY;
        // 将主机字节序的端口号转换为网络字节序，存入_addr（供网络传输用）
        _addr.sin_port = htons(_port);
    }
    InetAddr(const std::string &ip, uint16_t port) : _port(port), _ip(ip)
    {
        // 清空_addr结构体
        memset(&_addr, 0, sizeof(_addr));
        _addr.sin_family = AF_INET; // IPv4协议
        // 主机字节序端口 → 网络字节序，存入_addr
        _addr.sin_port = htons(_port);
        // 将字符串IP（如"192.168.1.1"）转换为网络字节序的二进制形式，存入_addr
        inet_pton(AF_INET, _ip.c_str(), &_addr.sin_addr);
    }
    ~InetAddr() = default;

    const struct sockaddr *NetAddPtr()
    {
        return (const struct sockaddr *)&_addr;
    }
    uint16_t Port()
    {
        return _port;
    }
    std::string Ip()
    {
        return _ip;
    }
    bool operator==(const InetAddr &addr)
    {
        return addr._ip == _ip && addr._port == _port;
    }
    std::string StringAddr()
    {
        return _ip + ":" + std::to_string(_port);
    }
    const struct sockaddr_in &NetAddr() { return _addr; }
  
    socklen_t NetAddlen()
    {
        return sizeof(_addr);
    }
    void SetAddr(struct sockaddr_in &addr)
    {
        // 网络转主机
        _addr = addr;
        _port = ntohs(_addr.sin_port);
        // 自定义缓冲区，更安全，兼容 IPv6 或多线程的场景
        char ipbuffer[64];
        inet_ntop(AF_INET, &_addr.sin_addr, ipbuffer, sizeof(_addr));
        _ip = ipbuffer;
    }

private:
    struct sockaddr_in _addr;
    std::string _ip;
    uint16_t _port;
};